home *** CD-ROM | disk | FTP | other *** search
- #if !defined(USEDUMP)
- #include "lprlib.h"
- #include "lprdef.h"
- #include "lprfuncs.h"
- #else
- #pragma load "lprDumpFile"
- #endif
-
- typedef struct {
- unsigned char * name;
- unsigned char type;
- unsigned char size;
- unsigned char * valptr;
- unsigned char * dvalptr;
- unsigned char * description;
- } keyinfo;
-
- extern unsigned char tcpinitok;
- extern settings_list ds, cs, fs;
- extern unsigned char vmpass[9]; /* VM password */
- extern unsigned long passtime; /* time password last stored */
-
- static keyinfo keytab[] = {
- {"class", 's', 2, fs.vmclass, ds.vmclass, "VM print class"},
- {"copies", 'u', 1, &fs.copycnt, &ds.copycnt, "Copy count"},
- {"debug", 'u', 1, &fs.dblevel, &ds.dblevel, "Debug level"},
- {"duplex", 'b', 1, &fs.duplex, &ds.duplex, "Duplex formatting"},
- {"form", 's', 9, fs.vmform, ds.vmform, "VM form type"},
- {"format", 'u', 1, &fs.fmttype, &ds.fmttype, "Formatting type (1-3)"},
- {"hdrclass", 's', 64, fs.hdrclass, ds.hdrclass, "Header classification"},
- {"hdrid", 's', 64, fs.hdrid, ds.hdrid, "Header user identification"},
- {"header", 'b', 1, &fs.hdrflag, &ds.hdrflag, "Generate header page (0 or 1)"},
- {"host", 's', 128, fs.hostname, ds.hostname, "Host name"},
- {"indent", 'u', 1, &fs.findent, &ds.findent, "Indent amount"},
- {"noff", 'b', 1, &fs.noff, &ds.noff, "Suppress form feed between files"},
- {"jobname", 's', 64, fs.jobname, ds.jobname, "Header job name"},
- {"myhost", 's', 64, fs.orghost, ds.orghost, "My host's name"},
- {"newprot", 'b', 1, &fs.newprot, &ds.newprot, "New lpr protocol"},
- {"pascal", 'b', 1, &fs.pascalflag, &ds.pascalflag, "Pascal formatting (0 or 1)"},
- {"pgsize", 'u', 1, &fs.fpgsize, &ds.fpgsize, "Page size (line count)"},
- {"printer", 's', 64, fs.printer, ds.printer, "Printer name"},
- {"retries", 'u', 1, &fs.retries, &ds.retries, "Network retry count"},
- {"split", 'b', 1, &fs.splitflag, &ds.splitflag, "Split long lines (0 or 1)"},
- {"tabsize", 'u', 1, &fs.ftabsize, &ds.ftabsize, "Tab column spacing"},
- {"timeout", 'u', 1, &fs.timeout, &ds.timeout, "Network timeout interval"},
- {"title", 's', 64, fs.fmttitle, ds.fmttitle, "Title line"},
- {"topmrg", 'u', 1, &fs.ftop, &ds.ftop, "Top margin"},
- {"userid", 's', 9, fs.vmuser, ds.vmuser, "VM userid"},
- {"username", 's', 64, fs.orguser, ds.orguser, "User name"},
- {"vm", 'b', 1, &fs.vmflag, &ds.vmflag, "VM printer (0 or 1)"},
- {"width", 'u', 1, &fs.fwidth, &ds.fwidth, "Line width"},
- {0, 0, 0, 0, 0, 0} }; /* marks end of list */
-
- extern struct Point sfppoint, sfgpoint;
- unsigned char setmsg1[256];
- unsigned char setmsg2[256];
- static unsigned char s_fName[64] = ""; /* last good settings filename */
-
- OSErr init_settings(void)
- {
- short appmsg, appcount;
- AppFile appinfo;
-
- /* initial file settings are defaults */
- fs = cs;
-
- /* attempt to get a file id for reading new settings */
-
- /* first try file passed by the Finder (or whomever) */
- CountAppFiles(&appmsg, &appcount);
- if ((appmsg == appOpen) && (appcount > 0)) {
- GetAppFiles(1, &appinfo);
- p2cstr(&appinfo.fName);
- if (appinfo.fType == 'lprp')
- if (0 == get_settings(&appinfo.fName, appinfo.vRefNum, 1)) return(0);
- }
-
- /* Next, try a standard get file dialog */
- if (0 == read_settings(1)) return(0);
- return(1);
- }
-
- short read_settings(initflg)
- unsigned char initflg;
- {
- Point where;
- FileFilterProcPtr fileFilter;
- DlgHookProcPtr dlgHook;
- short numTypes;
- SFTypeList typeList;
- SFReply reply;
- pascal Boolean (*filterProc) ();
-
- where = sfgpoint;
- fileFilter = 0;
- dlgHook = 0;
- numTypes = 1;
- typeList[0] = 'lprp';
- dlgHook = 0;
- filterProc = SF_Filter;
- SFPGetFile(where, "\pDefine remote printer from:", fileFilter,
- numTypes, typeList, dlgHook, &reply, getDlgID,
- (ModalFilterProcPtr)filterProc);
- if (reply.good == 0) return(8);
- p2cstr(&reply.fName);
- return(get_settings(&reply.fName, reply.vRefNum, initflg));
- }
-
- short get_settings(fname, vnum, initflg)
- unsigned char * fname;
- short vnum;
- unsigned char initflg;
- {
- /* state table for reading definition file */
- static unsigned unsigned char statetab[] =
- /* 0 1 2 3 4 5 6 */
- /* space char '=' '#' CR other EOF */
- /* 0: before name field */ { 0, 2, 8, 1, 0, 8, 0,
- /* 1: comment line */ 1, 1, 1, 1, 0, 1, 0,
- /* 2: reading name */ 3, 2, 4, 8, 8, 8, 8,
- /* 3: between name and =*/ 3, 8, 4, 8, 8, 8, 8,
- /* 4: between = and val */ 4, 5, 8, 8, 8, 8, 8,
- /* 5: reading value */ 6, 5, 8, 7, 0, 8, 0,
- /* 6: after value */ 6, 8, 8, 7, 0, 8, 0,
- /* 7: end comment */ 7, 7, 7, 7, 0, 7, 0 };
- /* 8: error */
-
- short fnum;
- OSErr rc;
- long filesize, l, readcount;
- unsigned char * filedata;
- unsigned char * nameptr, * valueptr;
- short oldstate, state, charindex;
- short linenum, namelen, valuelen;
-
- nameptr = valueptr = 0; /* just to avoid warning messages */
- namelen = valuelen = 0;
-
- /* set default volume to initial settings location */
- if (initflg) SetVol(0L, vnum);
- /* prepare first part of error messages */
- sprintf(setmsg1, "Error reading definition file %s", fname);
- /* read definition file into buffer */
- rc = fsrdopen(fname, vnum, &fnum);
- if (rc != 0) {
- sprintf(setmsg2, "Error %d opening file", rc);
- seterr();
- return(rc);
- }
- rc = GetEOF(fnum, &filesize); /* get file size */
- if (rc != 0) {
- FSClose(fnum);
- sprintf(setmsg2, "Error %d getting file size", rc);
- seterr();
- return(rc);
- }
- filedata = (unsigned char *)NewPtr(filesize+1); /* allocate buffer */
- /* extra byte for null termination */
- if (filedata == 0L) {
- FSClose(fnum);
- sprintf(setmsg2, "Not enough storage (%ld bytes) for file", filesize);
- seterr();
- return(rc);
- }
- readcount = filesize; /* read file data */
- rc = FSRead(fnum, &readcount, filedata);
- FSClose(fnum); /* close file */
- if ((rc != 0) || (readcount != filesize)) {
- DisposPtr(filedata);
- if (rc == 0) rc = 4;
- sprintf(setmsg2, "Error %d reading file contents", rc);
- seterr();
- return(rc);
- }
-
- state = 0;
- linenum = 1;
- fs = ds; /* start with default settings */
- for (l=0; l <= filesize; l++) {
- if (l < filesize)
- charindex = chrval(filedata[l]);
- else charindex = 6; /* EOF */
- oldstate = state;
- state = statetab[oldstate*7 + charindex];
- if (state == 8) break;
- if ((oldstate >= 5) && (state == 0)) {
- rc = setval(nameptr, namelen, valueptr, valuelen);
- if (rc != 0) {
- state = 8;
- break;
- }
- }
- if (charindex == 4) linenum++;
- if (charindex == 1)
- switch(state) {
- case 2:
- if (oldstate == 2) namelen++;
- else {
- nameptr = filedata+l;
- namelen = 1;
- }
- break;
- case 5:
- if (oldstate == 5) valuelen++;
- else {
- valueptr = filedata+l;
- valuelen = 1;
- }
- break;
- default:
- break;
- }
- }
- DisposPtr(filedata);
- /* if userid has changed, reset password */
- if (strcmp(cs.vmuser, fs.vmuser) != 0) {
- memset(vmpass, 0, 9);
- passtime = 0;
- }
- cs = fs; /* copy file values to current settings */
-
- if (state == 8) { /* error state */
- sprintf(setmsg2, "Syntax or keyword error on line %d", linenum);
- seterr();
- return(8);
- }
- else {
- memcpy(s_fName, fname, 64); /* save name of good file */
- return(0);
- }
- }
-
- void seterr(void)
- {
- pascal Boolean (*filterProc) ();
-
- filterProc = DlgFilter; /* for error alert */
- c2pstr(setmsg1);
- c2pstr(setmsg2);
- ParamText(setmsg1, setmsg2, "\p", "\p");
- p2cstr(setmsg1);
- p2cstr(setmsg2);
- putln(setmsg1);
- putln(setmsg2);
- StopAlert(261, (ModalFilterProcPtr)filterProc);
- ParamText("\p", "\p", "\p", "\p");
- }
-
- short chrval(chr)
- unsigned char chr;
- {
- register unsigned char c;
-
- c = chr & 0x7f;
- switch (c) {
- case '=':
- return(2);
- break;
- case '#':
- return(3);
- break;
- case 0x0d:
- return(4);
- break;
- default:
- if (isspace(c)) return(0);
- else if (isprint(c)) return(1);
- else return(5);
- break;
- }
- }
-
- short setval(nameptr, namelen, valueptr, valuelen)
- unsigned char * nameptr, * valueptr;
- short namelen, valuelen;
- {
- register short i;
- keyinfo * k;
- unsigned char namesave, valuesave;
-
- for (i=0; i < namelen; i++)
- nameptr[i] = tolower(nameptr[i]);
- namesave = nameptr[namelen];
- nameptr[namelen] = 0;
- valueptr[valuelen] = 0;
- k = keytab;
- while (k->size > 0) {
- if (strcmp(nameptr, k->name) == 0) break;
- k++;
- }
- nameptr[namelen] = namesave;
- if (k->size == 0) return(1);
- switch(k->type) {
- case 'b': /* binary flag */
- for (i=0; i < valuelen; i++)
- if (!isdigit(valueptr[i])) return(3);
- valuesave = valueptr[valuelen];
- valueptr[valuelen] = 0;
- i = atoi(valueptr);
- valueptr[valuelen] = valuesave;
- if ((i < 0) || (i > 1)) return(4);
- *(k->valptr) = i;
- break;
- case 'u': /* unsigned char */
- for (i=0; i < valuelen; i++)
- if (!isdigit(valueptr[i])) return(3);
- valuesave = valueptr[valuelen];
- valueptr[valuelen] = 0;
- i = atoi(valueptr);
- valueptr[valuelen] = valuesave;
- if ((i < 0) || (i > 255)) return(4);
- *(k->valptr) = i;
- break;
- case 'i': /* integer */
- for (i=0; i < valuelen; i++)
- if (!isdigit(valueptr[i])) return(5);
- valuesave = valueptr[valuelen];
- valueptr[valuelen] = 0;
- i = atoi(valueptr);
- valueptr[valuelen] = valuesave;
- *((short *)(k->valptr)) = i;
- break;
- case 's': /* string */
- if (valuelen > k->size - 1) return(6);
- memset(k->valptr, 0, k->size);
- memcpy(k->valptr, valueptr, valuelen);
- break;
- default:
- return(2);
- break;
- }
- return(0);
- }
-
- void write_settings(void)
- {
- Point where;
- DlgHookProcPtr dlgHook;
- SFReply reply;
- OSErr rc;
- short fnum;
- long count;
- unsigned char s[256];
- keyinfo * k;
- pascal Boolean (*filterProc) ();
-
- where = sfppoint;
- dlgHook = 0;
- c2pstr(s_fName);
- filterProc = SF_Filter;
- SFPPutFile(where, "\pSave current settings as:",
- s_fName, dlgHook, &reply, putDlgID,
- (ModalFilterProcPtr)filterProc);
- p2cstr(s_fName);
- if (reply.good == 0) return;
- p2cstr(&reply.fName);
- memcpy(s_fName, &reply.fName, 64); /* save filename */
- sprintf(setmsg1, "Error writing definition file %s", &reply.fName);
- c2pstr(&reply.fName);
- rc = FSDelete(&reply.fName, reply.vRefNum); /* delete existing file */
- if ((rc != 0) && (rc != -43)) { /* file not found is ok */
- sprintf(setmsg2, "Error %d deleting existing file", rc);
- seterr();
- return;
- }
- rc = Create(&reply.fName, reply.vRefNum, 'lpra', 'lprp');
- if (rc != 0) {
- sprintf(setmsg2, "Error %d creating new file", rc);
- seterr();
- return;
- }
- rc = FSOpen(&reply.fName, reply.vRefNum, &fnum);
- if (rc != 0) {
- sprintf(setmsg2, "Error %d opening new file", rc);
- seterr();
- return;
- }
- /* save current values as file values */
- fs = cs;
- /* handle excluding VM userid */
- /* write each value */
- k = keytab;
- while (k->size != 0) {
- s[0] = 0;
- switch (k->type) {
- case 'b':
- if (*((unsigned char *)k->valptr) ==
- *((unsigned char *)k->dvalptr)) break;
- sprintf(s, "%s=%d #%s\015", k->name,
- *((unsigned char *)k->valptr), k->description);
- break;
- case 'u':
- if (*((unsigned char *)k->valptr) == 0) break;
- if (*((unsigned char *)k->valptr) ==
- *((unsigned char *)k->dvalptr)) break;
- sprintf(s, "%s=%d #%s\015", k->name,
- *((unsigned char *)k->valptr), k->description);
- break;
- case 'i':
- if (*((short *)k->valptr) ==
- *((short *)k->dvalptr)) break;
- sprintf(s, "%s=%d #%s\015", k->name,
- *((short *)k->valptr), k->description);
- break;
- case 's':
- if (strcmp(k->valptr, k->dvalptr) == 0) break;
- if ((k->valptr)[0] == 0) break;
- if ((unsigned char *)k->valptr == fs.vmuser)
- if (vmuserdlg()) break;
- sprintf(s, "%s=%s #%s\015", k->name,
- k->valptr, k->description);
- break;
- default:
- break;
- }
- if (s[0] != 0) {
- count = strlen(s);
- rc = FSWrite(fnum, &count, s);
- if (rc != 0) {
- sprintf(setmsg2, "Error %d writing to file", rc);
- seterr();
- return;
- }
- }
- k++;
- }
- rc = FSClose(fnum);
- if (rc != 0) {
- sprintf(setmsg2, "Error %d closing file", rc);
- seterr();
- }
- }
-
- short new_settings(void)
- {
- return(fs != cs);
- }
-
- OSErr fsrdopen(fname, vref, fref) /* open file read-only */
- unsigned char * fname;
- short vref;
- short * fref;
- {
- IOParam pbi;
- OSErr rc;
-
- /* initialize parameter block */
- memset(&pbi, 0, sizeof(IOParam));
-
- pbi.ioNamePtr = (StringPtr)fname;
- pbi.ioVRefNum = vref;
- pbi.ioPermssn = fsRdPerm;
- c2pstr(fname);
- rc = PBOpen((ParmBlkPtr)&pbi, 0);
- *fref = pbi.ioRefNum;
- p2cstr(fname);
- return(rc);
- }
-
- pascal Boolean SF_Filter(dlg, eventptr, itemptr)
- DialogPtr dlg;
- EventRecord * eventptr;
- short * itemptr;
- {
- #pragma unused(dlg, eventptr, itemptr)
-
- /* if (tcpinitok) Stask(); */
- return(false);
- }
-